# 线程池的学习，所有的方法和类都放在这里

"""
pool = ThreadPoolExecutor(100)
pool.submit(函数名,参数1，参数2，参数...)

http://t.zoukankan.com/gudanaimei-p-14408848.html
"""
import time

from concurrent.futures.thread import ThreadPoolExecutor


# 定义一个函数，用来测试多线程的使用
def task_fun(video_url, num):
    print("开始执行任务", video_url, num)  # 开始执行任务 www.xxxx-299.com 3
    time.sleep(1)
    return f'EEEEEEEEEEE执行完成 video_url = {video_url}'


def deal_resp_red(res):
    print(f'res========{res.result()}')


def thread_start():
    # 创建线程池，最多维护10个线程 max_workers=10
    thread_pool = ThreadPoolExecutor(max_workers=10)

    # 生成300网址，并放入列表
    url_list = [f'www.thread-{i}.com' for i in range(30)]
    for url in url_list:
        """
        在线程池中提交一个任务，线程池如果有空闲线程，则分配一个线程去执行，执行完毕后在将线程交还给线程池，
        如果没有空闲线程，则等待。
        注意在等待时，与主线程无关，主线程依然在继续执行。
        """
        task_res = thread_pool.submit(task_fun, url, 2)
        print(f'task_res 执行的结果 = {task_res.result()}')
        # 使用子线程调用回调函数，传递的参数是 task_res 。回调函数需要从task_res.result()拿到上一步的返回参数
        task_res.add_done_callback(deal_resp_red)

    print("等待线程池中的任务执行完毕中······")
    thread_pool.shutdown(True)  # 等待线程池中的任务执行完毕后，在继续执行
    print("END")


if __name__ == '__main__':
    thread_start()
